// ActionScript file
package sww
{
      import flash.events.Event;
      import flash.events.MouseEvent;
      
      import mx.core.Application;
      import mx.core.IMXMLObject;
      import mx.managers.PopUpManager;
      import mx.messaging.Consumer;
      import mx.messaging.Producer;
      import mx.messaging.messages.AsyncMessage;
      import mx.messaging.messages.IMessage;
      
      import sww.dto.NoteData;
      
	public class StickyNoteLogic implements IMXMLObject{
      
      private static const OP_STICKY:String = "sticky";
      private static const WINDOW_CLOSE:Number = 1;
      private static const WINDOW_LIVING:Number = 0;
      private const SIZE_DRAGAREA:int = 5;
      private const SIZE_MIN_WIDTH:int = 40;
      private const SIZE_MIN_HEIGHT:int = 30;

      private var blDragTop:Boolean = false;
      private var blDragRight:Boolean = false;
      private var blDragBottom:Boolean = false;
      private var blDragLeft:Boolean = false;
      private var iDragPosHeight:int = 0;
      private var iDragPosWidth:int = 0;       

      private var myproducer:Producer;
      private var myconsumer:Consumer;
      private var view:StickyNote;
      private var flgChild:int = 0
           
      /**
      * <dd>コンストラクタ
      * @param document 	このLogicのViewであるmxml
      * @param id 		このターゲットの ID 
      * @return 			なし
      */
      public function initialized(document:Object, id:String):void 
      {   
      	view = document as StickyNote;  
      }
      
      /**
      * <dd>送信用オブジェクトセット
      * @param parentProducer 	親画面から受け取った送信用オブジェクト
      * @return 					なし
      */
      public function set producer(parentProducer:Producer):void
      {
      	this.myproducer = parentProducer;
      }
      
      /**
      * <dd>受信用オブジェクトセット
      * @param parentProducer 	親画面から受け取った受信用オブジェクト
      * @return 					なし
      */
      public function set consumer(parentConsumer:Consumer):void
      {
      	this.myconsumer = parentConsumer;
      }
      
 
      
      /**
      * <dd>ページ作成完了
      *	<dd>mxml作成完了時に呼び出されるメソッド。
      *<dd>親画面に付箋移動のリスナをセットする。
      * @param 		なし
      * @return 		なし
      * 
      * 2009/02/06 親画面の送信イベントを削除
      * StickyNote.mxmlのmx:TitleWindowのプロパティから以下を削除
      *   creationComplete="logic.onThis_creationComplete();"
      */  
      public function onThis_creationComplete():void
      {
        // 親画面にmouseUpとmouseMoveイベントを追加
        Application.application.parent.addEventListener(MouseEvent.MOUSE_UP, onParent_mouseUp);
        Application.application.parent.addEventListener(MouseEvent.MOUSE_MOVE, onParent_mouseMove);      
      }

      /**
      * <dd>マウス押下
      *	<dd>マウス押下時に呼び出されるメソッド。
      * <dd>移動元座標をセット
      * @param MouseEvent マウスイベント
      * @return 		なし
      */ 
      public function onThis_mouseDown(event:MouseEvent):void
      {
        // check Top pos
        if( event.localY < SIZE_DRAGAREA )
        {
          blDragTop = true;
          iDragPosHeight = event.localY;
        }

        // check Right pos
        if( view.width - SIZE_DRAGAREA < event.localX )
        {
          blDragRight = true;
          iDragPosWidth = view.width - event.localX;
        }

        // check Bottom pos
        if( view.height - SIZE_DRAGAREA < event.localY )
        {
          blDragBottom = true;
          iDragPosHeight = view.height - event.localY;
        }
        
        // check Left pos
        if( event.localX < SIZE_DRAGAREA )
        {
          blDragLeft = true;
          iDragPosWidth = event.localX;
        }
      }

      /**
      * <dd>親画面マウスドラッグ
      *	<dd>親画面マウスドラッグ時に呼び出されるメソッド。
      * <dd>ドラッグメソッド呼び出し
      * @param MouseEvent マウスイベント
      * @return 		なし
      */ 
      public function onParent_mouseMove(event:MouseEvent):void
      {
        doDrag(event.stageX, event.stageY);
      }

      /**
      * <dd>マウスドラッグ
      *	<dd>マウスドラッグ時に呼び出されるメソッド。
      * <dd>ドラッグメソッド呼び出し
      * @param MouseEvent マウスイベント
      * @return 		なし
      */
      public function onThis_mouseMove(event:MouseEvent):void
      {
        doDrag(event.stageX, event.stageY);
      }

      /**
      * <dd>親画面マウスボタンアップ
      *	<dd>親画面でマウスボタンアップ時に呼び出されるメソッド。
      * <dd>ドラッグモード解除メソッド呼び出し
      * @param MouseEvent マウスイベント
      * @return 		なし
      */
      public function onParent_mouseUp(event:MouseEvent):void
      {
        outDragMode();
      }

      /**
      * <dd>マウスボタンアップ
      *	<dd>マウスボタンアップ時に呼び出されるメソッド。
      * <dd>ドラッグモード解除メソッド呼び出し
      * @param MouseEvent マウスイベント
      * @return 		なし
      */
      public function onThis_mouseUp(event:MouseEvent):void
      {
        outDragMode();
      }
      
      /**
      * <dd>クローズボタン押下
      *	<dd>クローズボタン押下時に呼び出されるメソッド。
      * <dd>付箋ウィンドウ削除
      * @param なし
      * @return 		なし
      */
      public function onThis_close():void
      {
      	//送信メソッド呼び出し
      	doSend(WINDOW_CLOSE);
        PopUpManager.removePopUp(view);
        
      }

	  /**
      * <dd>マウスドラッグ
      *	<dd>マウスドラッグ時に呼び出されるメソッド。
      * <dd>テキストボックス移動
      * @param int 移動分X座標
      * @param int 移動分Y座標 
      * @return 		なし
      */
      private function doDrag(intX:int, intY:int):void
      {
        if( blDragTop )
        {
          if( view.y + view.height - intY + iDragPosHeight > SIZE_MIN_HEIGHT )
          {
            view.height = view.y + view.height - intY + iDragPosHeight;
            view.y = intY - iDragPosHeight;
          }
          else
          {
            view.y = view.y + view.height - SIZE_MIN_HEIGHT;
            view.height = SIZE_MIN_HEIGHT;
          }
        }

        if( blDragRight )
        {
          if( intX - view.x + iDragPosWidth > SIZE_MIN_WIDTH )
          {
            view.width = intX - view.x + iDragPosWidth;
          }
          else
          {
            view.width = SIZE_MIN_WIDTH;
          }
        }
        
        if( blDragBottom )
        {
          if( intY - view.y + iDragPosHeight > SIZE_MIN_HEIGHT )
          {
            view.height = intY - view.y + iDragPosHeight;
          }
          else
          {
            view.height = SIZE_MIN_HEIGHT;
          }
        }
        
        if( blDragLeft )
        {
          if( view.x + view.width - intX + iDragPosWidth > SIZE_MIN_WIDTH )
          {
            view.width = view.x + view.width - intX + iDragPosWidth;
            view.x = intX - iDragPosWidth;
          }
          else
          {
            view.x = view.x + view.width - SIZE_MIN_WIDTH;
            view.width = SIZE_MIN_WIDTH;
          }
        }
        
      }
      
      private function outDragMode():void
      {
        blDragTop = blDragRight = blDragBottom = blDragLeft = false;
        //送信メソッド呼び出し
      	doSend(WINDOW_LIVING);
      }
      
      public function onThis_Change(event:Event):void
      {
      	//送信メソッド呼び出し
      	doSend(WINDOW_LIVING);
      }
      
      /**
      * <dd>送信メソッド
      * <dd>ユーザ名・位置・大きさ・テキスト・固有番号を
      * <dd>メッセージに入れて送信する。
      * @param Number クローズフラグ 0:変更のみ 1:クローズ
      * @return 	  なし
      */ 
      private function doSend(closeflg:Number):void
      {
      	try{
	      	if (myconsumer.subscribed && view.flgchild == 0)
			{
								
				var localNote:NoteData = new NoteData();
				
				//テキストボックスの変更
			    if (closeflg == WINDOW_LIVING)
			    {
			    	//ユーザ名・位置・大きさ・テキスト・固有番号をセット
				    localNote.NoteProperties(view.num,
				    						 	view.title, 
				      	                         view.height,
				      	                         view.width,
				      	                         view.x,
				      	                         view.y,
				      	                         view.myTextBox.text);
					
				//テキストボックスクローズ		
		      	}else{
		      		localNote.NoteProperties(view.num, view.title, 0, 0, 0, 0, "");
		      	}		      	
		      	
				//自クライアントテキストボックス配列を更新
				changeMeOfArrayByName(view, closeflg);
		      	
		      	//メッセージ作成
		      	var msg:IMessage = new AsyncMessage();
		      	
		      	//操作セット
				msg.headers["operation"] = OP_STICKY;
		      	
		      	//メッセージボディ設定   	
				msg.body = localNote;
				
				//送信		
			    Application.application.sendMessageToServer(msg);
			    
		    }
      		
      	}catch(err:Error){
      		
      	}
      	
      	
      } 
      
      /**
		*　親画面のテキストボックス配列より
		*　指定されたテキストボックス（自分）を入れ替えるか削除する。
		*  @param StickyNote テキストボックス
		*  @param Number クローズフラグ 0:変更のみ 1:クローズ
		*  @return Boolean True:入れ替え・削除あり 
		*/ 
		private function changeMeOfArrayByName(mybox:StickyNote, closeflg:Number):Boolean {
		    var ret:Boolean = false;
		    for (var i:uint=0; i < Application.application.myText.length; i++) {	        
		        if(Application.application.myText[i].id == mybox.id){
		        	if (closeflg == WINDOW_LIVING){
		        		//テキストボックスの変更ならば入れ替え
			        	Application.application.myText[i] = mybox;
			        }else{
			        	//テキストボックスのクローズならば要素を削除
			        	Application.application.myText.splice(i);			
			        }
			        ret = true;
			        break;
		        }
		    }
		    return ret;
		}
      
	}   
      
}